package game.controler.ecouteurs.vue;

import game.controler.EtatJeu;
import game.controler.gestionnaires.elementjeu.GestionnaireDecors;
import game.controler.gestionnaires.elementjeu.GestionnaireFous;
import game.controler.gestionnaires.elementjeu.GestionnaireObjets;
import game.controler.gestionnaires.elementjeu.GestionnairePnj;
import game.model.objets.ElementDecors;
import game.model.objets.ElementJeu;
import game.model.objets.Fou;
import game.model.objets.Objet;
import game.model.objets.PNJ;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;

/**
 *
 * @author Gab'z
 */
public class EcouteurVuePNJ implements MouseListener {

    private String id;

    public EcouteurVuePNJ(String id) {
        this.id = id;
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        if (EtatJeu.clicVueAutorisé()) {
            System.out.println("clic sur un PNJ : " + id);
            System.out.println("Coord (x,y) = (" + e.getX() + "," + e.getY() + ")");

            Point coordRelativeClic = new Point(e.getX(), e.getY());

            PNJ pnj = GestionnairePnj.getGpnj().getPNJ(id);
            String idPlanCourant = EtatJeu.getIdPlanCourant();
            if (TesteurImage.isTransparent(PNJ.class, id, coordRelativeClic)) {
                Point coordAbsolueClic = new Point(pnj.getPosition().x + coordRelativeClic.x, pnj.getPosition().y + coordRelativeClic.y);
                ElementJeu elementJeu = null;

                System.out.println("pixel transparent");
                // couche 3 -> pnj

                ArrayList<String> listePNJ = GestionnairePnj.getGpnj().getListePnjPlan(idPlanCourant);
                ArrayList<String> listePNJTestables = new ArrayList<String>(0);
                for (int i = 0; i < listePNJ.size(); i++) {
                    PNJ p = GestionnairePnj.getGpnj().getPNJ(listePNJ.get(i));
                    if (p.isVisible() && !p.getId().equals(pnj.getId())) {
                        listePNJTestables.add(p.getId());
                    }
                }
                for (String idPNJ : listePNJ) {
                    if (elementJeu == null) {
                        elementJeu = TesteurImage.testerClic(PNJ.class, idPNJ, coordAbsolueClic);
                    }
                }

                // couche 2 -> objet
                if (elementJeu == null) {
                    ArrayList<String> listeObjets = GestionnaireObjets.getGobjets().getListeObjetsPlan(idPlanCourant);
                    ArrayList<String> listeObjetsTestables = new ArrayList<String>(0);
                    for (int i = 0; i < listeObjets.size(); i++) {
                        Objet obj = GestionnaireObjets.getGobjets().getObjet(listeObjets.get(i));
                        if (obj.isVisible() && !obj.isTop()) {
                            listeObjetsTestables.add(obj.getId());
                        }
                    }
                    for (String idObjet : listeObjetsTestables) {
                        if (elementJeu == null) {
                            elementJeu = TesteurImage.testerClic(Objet.class, idObjet, coordAbsolueClic);
                        }
                    }
                }

                //couche 2 bis -> fou
                if (elementJeu == null) {
                    ArrayList<String> listeFou = GestionnaireFous.getGfous().getListeFousPlan(idPlanCourant);
                    ArrayList<String> listeFouTestable = new ArrayList<String>(0);
                    for (int i = 0; i < listeFou.size(); i++) {
                        Fou fou = GestionnaireFous.getGfous().getFou(listeFou.get(i));
                        if (fou.isVisible() && !fou.isTop()) {
                            listeFouTestable.add(fou.getId());
                        }
                    }
                    for (String idFou : listeFouTestable) {
                        if (elementJeu == null) {
                            elementJeu = TesteurImage.testerClic(Fou.class, idFou, coordAbsolueClic);
                        }
                    }
                }

                // couche 1 -> elementDécors
                if (elementJeu == null) {
                    ArrayList<String> listeElmtDecors = GestionnaireDecors.getGdecors().getListeDecorsPlan(idPlanCourant);
                    ArrayList<String> listeElmtDecorsTestable = new ArrayList<String>(0);
                    for (int i = 0; i < listeElmtDecors.size(); i++) {
                        ElementDecors elem = GestionnaireDecors.getGdecors().getElementDecors(listeElmtDecors.get(i));
                        if (elem.isVisible()) {
                            listeElmtDecorsTestable.add(elem.getId());
                        }
                    }
                    for (String idElmtDecors : listeElmtDecorsTestable) {
                        if (elementJeu == null) {
                            elementJeu = TesteurImage.testerClic(ElementDecors.class, idElmtDecors, coordAbsolueClic);
                        }
                    }
                }

                if (elementJeu != null) {
                    System.out.println("Clic sur " + elementJeu.getId());
                    elementJeu.executeActionClicVue();
                } else {
                    System.out.println("Rien derrière " + pnj.getId());
                }

            } else {
                System.out.println("pixel plein");
                pnj.executeActionClicVue();
            }
        } else {
            System.out.println("EcouteurVuePNJ : clic non autorisé");
        }

    }

    @Override
    public void mousePressed(MouseEvent e) {
        //  throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        // throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void mouseExited(MouseEvent e) {
        // throw new UnsupportedOperationException("Not supported yet.");
    }
}
